package com.example.dingtalklogin;

import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import com.example.dingtalklogin.manager.dingtalk.AccessTokenManager;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

import javax.annotation.Resource;

@SpringBootApplication
@EnableFeignClients
@MapperScan(basePackages = "com.example.dingtalklogin.dao")
public class DingtalkLoginApplication implements ApplicationRunner {

    @Resource
    private AccessTokenManager accessTokenManager;

    public static void main(String[] args) {
        SpringApplication.run(DingtalkLoginApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 启动请求钉钉token , 并从0点开始每1个小时请求一次
        //access_token的有效期为7200秒（2小时），有效期内重复获取会返回相同结果并自动续期，过期后获取会返回新的access_token。
        //开发者需要缓存access_token，用于后续接口的调用。因为每个应用的access_token是彼此独立的，所以进行缓存时需要区分应用来进行存储。
        //不能频繁调用gettoken接口，否则会受到频率拦截。
        // 钉钉的token有这种特性所以可以这么设计，就算应用跑多个实例也不会出现问题
        // 拦截器有过期处理，这里时间间隔没问题，一般不需要事件刷新
        accessTokenManager.refreshToken();
        CronUtil.schedule("0 0 0/1 * * ? ", (Task) () -> {
            accessTokenManager.refreshToken();
        });
        CronUtil.start(true);
    }
}
